package com.yqx.guli.test;

import org.apache.commons.lang.StringUtils;

import java.io.File;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

public class RenameFiles {
    /**
     * 获取一个文件夹下的所有文件全路径
     *
     * @param path         文件夹路径
     * @param listFileName 存储文件名
     *                         
     */
    public static void getAllFileName(String path, ArrayList<String> listFileName) {
        File file = new File(path);
        File[] files = file.listFiles();
        String[] names = file.list();
        if (names != null) {
            String[] completNames = new String[names.length];
            for (int i = 0; i < names.length; i++) {
                completNames[i] = path + names[i];
            }
            listFileName.addAll(Arrays.asList(completNames));
        }
        for (File a : files) {
            //如果文件夹下有子文件夹，获取子文件夹下的所有文件全路径。
            if (a.isDirectory()) {
                getAllFileName(a.getAbsolutePath() + "\\", listFileName);
            }
        }
    }

    /**
     * 重命名文件
     *
     * @param filePath 重命名后文件的目标目录
     * @param fileName 重命名前的完整文件路径
     * @return
     */
    public static void renameFile(String filePath, String fileName) {
        SimpleDateFormat fmdate = new SimpleDateFormat("yyyyMMddHHmmssSSS");
        String oldFileName = fileName;
        File oldFile = new File(oldFileName);
        String newFileName = filePath + File.separator + fmdate.format(new Date()) + "." + fileName.split("\\.")[1];
        File newFile = new File(newFileName);
        if (oldFile.exists() && oldFile.isFile()) {
            oldFile.renameTo(newFile);
        }
    }

    public static void renameFile2(String filePath, String fileName) {
        String oldFileName = fileName;
        File oldFile = new File(oldFileName);
        String newFileName = oldFileName.replace("5-", "");
        File newFile = new File(newFileName);
        if (oldFile.exists() && oldFile.isFile()) {
            oldFile.renameTo(newFile);
        }
    }

    /**
     * 将 某路径 下 mp3文件, 根据文件生成时间，  在该文件前面加上前缀
     *
     * @param filePath   文件路径
     * @param updateTime 根据用户输入时间 8为字符串 格式为 yyyyMMdd      ，例如20210314
     * @param pre        文件名前缀
     */
    public void renameMusics(String filePath, String updateTime, String pre) {
        if (null != filePath && !("").equals(filePath) && !filePath.endsWith("\\")) {
            filePath = filePath + "\\";
        }
        List<MusicFile> allFileInfos = getAllFileName(filePath);
        for (MusicFile oneFile : allFileInfos) {
            long lastModifyTime = oneFile.getLastModifyTime();
            String oldFilePath = oneFile.getFileName();
//            System.out.println(oneFile.getFileName() + ", " + oneFile.getLastModifyTime());
            boolean flag = compareTime(updateTime, lastModifyTime);
            if (flag) {
                //判断文件类型为mp3的进行修改
                if (StringUtils.isNotEmpty(oldFilePath) && StringUtils.isNotBlank(oldFilePath) && (oldFilePath).endsWith(".mp3")) {
                    System.out.println("修改文件名称" + oldFilePath);
                    doRename(oldFilePath, pre);
                }
            }
        }
    }

    /**
     * 获取一个文件夹下的所有文件全路径 以及 文件修改日期
     *
     * @param path 文件夹路径
     *                 
     */
    public List<MusicFile> getAllFileName(String path) {
        List<MusicFile> returnList = new ArrayList<>();
        File file = new File(path);
        File[] files = file.listFiles();
        String[] names = file.list();
        if (names != null) {
            String[] completNames = new String[names.length];
            for (int i = 0; i < names.length; i++) {
                MusicFile musicFile = new MusicFile();
                completNames[i] = path + names[i];
                long lastModified = files[i].lastModified();
                musicFile.setFileName(completNames[i]);
                musicFile.setLastModifyTime(lastModified);
                returnList.add(musicFile);
            }
        }
        return returnList;
    }


    /**
     * 比较时间    根据用户输入时间 8为字符串 格式为 yyyyMMdd      ，例如20210314
     * 与long类型 文件修改时间比较  若 inputTime >= fileTime ,返回true
     * 否则  返回 false
     *
     * @param inputTime
     * @param fileTime
     * @return
     */
    public boolean compareTime(String inputTime, Long fileTime) {
        if (StringUtils.isEmpty(inputTime)) {
            return false;
        }
        SimpleDateFormat sf = new SimpleDateFormat("yyyyMMdd");
        try {
            Date parse = sf.parse(inputTime);
            long inpTime = parse.getTime();
            if (inpTime < fileTime) {
                return true;
            }
        } catch (ParseException e) {
            e.printStackTrace();
            return false;
        }
        return false;
    }

    public void doRename(String oldFilePath, String pre) {
        File oldFile = new File(oldFilePath);
        String oldFileName = oldFile.getName();
        String newFileName = pre + oldFileName;
        String newFilePath = oldFilePath.replace(oldFileName, newFileName);
        System.out.println("newFilePath:" + newFilePath);
        File file = new File(newFilePath);
        oldFile.renameTo(file);
    }

    public static void main(String[] args) {
        RenameFiles renameFiles = new RenameFiles();
        long start = System.currentTimeMillis();

        renameFiles.renameMusics("H:\\KwDownload\\song", "20210311", "8-");

//        ArrayList<String> listFileName = new ArrayList<String>();
//        getAllFileName("H:\\KwDownload\\song\\", listFileName);
//        System.out.println();
//        for (String name : listFileName) {
//            System.out.println(name);
//            renameFile2("H:\\KwDownload\\song\\", name);
//        }

        long end = System.currentTimeMillis();
        System.out.println("business start: " + start + " ms, end: " + end + "ms");
        System.out.println("business used " + (end - start) + " ms");
    }
}
